#!/usr/bin/env python
#coding:utf-8
#用于下载web.py站上的中文cookbook,网站原链接地址丢失

import os
import urllib2
from sgmllib import SGMLParser

WEBSITE = 'http://webpy.org/cookbook/index.zh-cn'

class URLLister(SGMLParser):
    '''此类用于解析HTML文档中的href链接'''
    def reset(self):
        SGMLParser.reset(self)
        self.urls = []

    def start_a(self, attrs):
        href = [v for k, v in attrs if k=='href']
        if href:
            self.urls.extend(href)

class downPage:
    '''
    此类用于：
    - 下载并保存首页
    - 解析首页，链接原链接中的名称
    - 将名称与网址进行拼接，得到真实可用的地址
    - 下载二级页面内容并保存
    '''
    def __init__(self, url):
        '''初始化类'''
        self.url = url
        
    def openurl(self, url):
        '''使用urllib2打开网络链接并读取数据'''
        sock = urllib2.urlopen(url)
        html = sock.read()
        return html

    def saveFile(self, html, fname):
        '''将下载页来的文档保存到设定的目录中去'''
        print 'Save as:' + fname
        if not os.path.isdir('cookbook/'):
            os.mkdir('cookbook')
        f = file(r'cookbook/' + fname, 'w')
        f.write(html)
        f.close()

    def saveIndexPage(self, fname='index.html'):
        '''保存首页文档'''
        html = self.openurl(self.url)
        self.saveFile(html, fname)

    def docPage(self):
        '''获得链接，并将链接进行拼接，得到真实可用的文档链接，并执行下载'''
        #记数器，用于创建新文档的前缀
        count = 0
        names = []
        #读取首页，获到html文档内容
        html = self.openurl(self.url)
        p = URLLister()
        #解析html
        p.feed(html)
        #获取文本中的链接
        for url in p.urls:
            #获取的链接中包含有所不需要的链接，需过滤掉。规范的组成是三个，且最后一项包含'zh-cn
            if (len(url.split('/'))==3) and (url[-5:]=='zh-cn'):
                #取其链接中的名称，这个在后面拼接真实地址时需要用到。
                path = url.split('/')[1]
                names.append(path)

        for name in names:
            #拼接可下载的址
            myurl = 'http://webpy.org/cookbook/'+\
                    name + '.zh-cn'
            #在试用中，发现有链接不存在的情况，所以需过滤掉
            try:
                html = self.openurl(myurl)
                self.saveFile(html, '%s_%s.html'%(count, name))
            except IOError:
                print 'Oops! "%s" not found!' % myurl
                pass
            count += 1        

def main():
    '''执行主函数'''
    s = downPage(WEBSITE)
    s.saveIndexPage()
    s.docPage()

#运行程序
if __name__ == '__main__':
    main()
    
